package chapter04.s05polymorphic.example17;

// 强制类型转换时，不能直接 将父类实例强制转换为子类实例，否则程序会报错
// 可以使用 instanceof关键字：判断一个对象是否是某个类的实例

// 定义类Anmal
class Animal {
    public void shout() {
        System.out.println("动物叫……");
    }
}

// Dog类
class Dog extends Animal {
    // 重写shout()方法
    public void shout() {
        System.out.println("汪汪……");
    }

    public void eat() {
        System.out.println("吃骨头……");
    }
}

class Cat extends Animal {
    // 重写shout()方法
    public void shout() {
        System.out.println("喵喵……");
    }

    public void eat() {
        System.out.println("吃鱼……");
    }
}


// 定义测试类
public class Example17 {
    public static void main(String[] args) {
        Animal animal = new Dog();         // 通过向上转型实例化Animal对象
        // 使用 instanceof关键字 判断一个 变量指向的对象 是否是某个类的实例
        System.out.println("animal instanceof Animal：" + (animal instanceof Animal)); //子类对象 instanceof 父类 = true
        System.out.println("animal instanceof Dog：" + (animal instanceof Dog));
        System.out.println("animal instanceof Cat：" + (animal instanceof Cat));

        // 使用 instanceof， 实现 安全的类型转换
        Dog dog;
        Cat cat;
        // 直接强制转换，运行时 可能会报错. 这里可以放开注释测试下。
        // cat = (Cat) animal;
        if (animal instanceof Dog) {
            dog = (Dog) animal;
        } else if (animal instanceof Cat) {
            cat = (Cat) animal;
        }
    }
}
